# 선언형 VS 함수형 프로그래밍

# 프로그래밍 패러다임

정의

프로그래밍 패러다임은 프로그래머에게 프로그래밍의 관점을 갖게 해주는 역할을 하는 개발 방법론입니다.

  • 객체지향 프로그래밍은 프로그래머들이 프로그램을 상호 작용하는 객체들의 집합으로 볼 수 있게 합니다.
  • 함수형 프로그래밍은 항태값을 지니지 않는 함수 값들의 연속으로 생각할 수 있게 합니다.
  • jdk1.8 이전의 자바는 객체지향 프로그래밍을 지원하는 반면에, 하스켈은 함수형 프로그래밍을 지원합니다.
  • 여러 패러다임을 지원하는 언어: C++, 파이썬, 자바스크립트
  • jdk 1.8부터 함수형 프로그래밍 패러다임을 지원: 람다식, 생성자 레퍼런스, 메서드 레퍼런스를 도입했습니다.
  • jdk 1.8부터 선언형 프로그래밍을 지원: 표준 API 스트림을 추가했습니다.

image

프로그래밍 패러다임은 크게 선언형, 명령형으로 나누며, 선언형은 함수형이라는 하위 집합을 갖습니다. 또한 명령형은 다시 객체지향, 절차지향으로 나눕니다.

# 선언형 프로그래밍 (declarative programming)

정의

프로그램이 어떤 방법으로 해야 하는지를 나타내기보다 무엇과 같은지를 설명하는 경우에 "선언형"이라고 합니다.

  • '무엇을' 풀어내는가에 집중하는 패러다임입니다.
  • "프로그램을 함수로 이루어진 것이다"라는 명제가 담겼습니다.

# 함수형 프로그래밍 (functional programming)

정의

선언형 패러다임의 일종으로, 자료 처리를 수학적 함수의 계산으로 취급하고 상태와 가변 데이터를 멀리하는 프로그래밍 패러다임의 하나이다.

  • 명령형 프로그래밍에서는 상태를 바꾸는 것을 강조하는 것과는 달리, 함수형 프로그래밍은 함수의 응용을 강조합니다.

예를 들어 자연수로 이루어진 배열에서 최댓값을 찾으라고 한다면 다음과 같이 로직을 구성합니다.

const ret = [1, 2, 3, 4, 5, 11, 12]
.reduce((max, num) => num > max ? num : max, 0)
console.log(ret) // 12
  • 앞의 코드에서 reduce()는 ‘배열’만 받아서 누적한 결괏값을 반환하는 순수 함수입니다.
  • 함수형 프로그래밍은 이와 같은 작은 ‘순수 함수’들을 블록처럼 쌓아 로직을 구현하고 ‘고차 함수’를 통해 재사용성을 높인 프로그래밍 패러다임입니다.
  • 자바스크립트는 단순하고 유연한 언어이며, 함수가 일급 객체이기 때문에 객체지향 프로그래밍보다는 함수형 프로그래밍 방식이 선호됩니다.

# 순수 함수

정의

출력이 입력에만 의존하는 것을 의미합니다.

const pure = (a, b) => {
    return a + b
}
  • pure 함수는 들어오는 매개변수 a, b에만 영향을 받습니다. 만약 a, b 말고 다른 전역 변수 c 등이 이 출력에 영향을 주면 순수 함수가 아닙니다.

# 고차 함수 (higher-order function)

정의

고차 함수란 함수가 함수를 값처럼 매개변수로 받아 로직을 생성하거나 반환하는 함수를 고차 함수라고 합니다.

  • 함수를 반환하는 메서드
public static Comparator<String> compareInDirection(int direction) {
    return (x, y) -> direction * x.compareTo(y);
}
  • 함수를 수정하는 메서드
public static Comparator<String> reverse(Comparator<String> comp) {
    return (x, y) -> comp.compare(y, x);
}

# 일급 객체

정의

일반적으로 다를 객체들에 적용 가능한 연산을 모두 지원하는 객체를 가리킵니다.
함수를 값으로 사용 할 수도 있으며 파라미터로 전달 및 변수에 대입하기와 같은 연산들이 가능합니다.

  • 이때 고차 함수를 쓰기 위해서는 해당 언어가 일급 객체라는 특징을 가져야 합니다.
    • 변수나 메서드에 함수를 할당할 수 있습니다.
    • 함수 안에 함수를 매개변수로 담을 수 있습니다.
    • 함수가 함수를 반환할 수 있습니다.

# 자바에서의 함수형 프로그래밍

자바에서 함수형 프로그래밍을 할 수 있도록 함수형 인터페이스(Functional Interface)람다 표현식(Lambda Expressions)을 제공합니다.

# 기본 함수형 인터페이스

  • Function<T, R>
  • BiFunction<T, U, R>
  • Consumer
  • Supplier
  • Predicate
  • UnaryOperator
  • BinaryOperator

# 참고자료